package org.example.maven.utils;
import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.concurrent.TimeUnit;
public class SearchIpUtils {
    // 定义环境变量名（本地和服务器统一）
    private static final String ENV_DB_PATH = "IP2REGION_DB_PATH";
    public static String getUserAddress(String ip) {
        //System.out.println(dbPath);
        try {
            // 1. 从环境变量获取路径
            String dbPath = System.getenv(ENV_DB_PATH);
            if (dbPath == null || dbPath.isEmpty()) {
                throw new IllegalArgumentException("环境变量 " + ENV_DB_PATH + " 未设置");
            }

            // 2. 检查文件是否存在
            Path path = Paths.get(dbPath);
            if (!Files.exists(path)) {
                throw new FileNotFoundException("IP数据库文件未找到: " + dbPath);
            }
            byte[] cBuff;
            try {
                // 2. 从临时文件加载内容
                cBuff = Searcher.loadContentFromFile(dbPath);
            } catch (Exception e) {
                System.out.printf("failed to load content from `%s`: %s\n", dbPath, e);
                return "failed to load content from"+dbPath+e;
            }

            // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。
            Searcher searcher;
            try {
                searcher = Searcher.newWithBuffer(cBuff);
            } catch (Exception e) {
                System.out.printf("failed to create content cached searcher: %s\n", e);
                return "failed to create content cached searcher"+e;
            }

            // 3、查询
            try {
                long sTime = System.nanoTime();
                String region = searcher.search(ip);
                long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
                System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
                String[] parts = region.split("\\|");
                return parts[2] + " " + parts[3]; // 例如 "广东省 深圳市"
            } catch (Exception e) {
                System.out.printf("failed to search(%s): %s\n", ip, e);
                return "failed to search("+ip+"):"+e;
            }
        }catch (Exception e){
            e.printStackTrace();
            return e.toString();
        }

        // 1、从 dbPath 加载整个 xdb 到内存。



        // 4、关闭资源 - 该 searcher 对象可以安全用于并发，等整个服务关闭的时候再关闭 searcher
        // searcher.close();

        // 备注：并发使用，用整个 xdb 数据缓存创建的查询对象可以安全的用于并发，也就是你可以把这个 searcher 对象做成全局对象去跨线程访问。
    }
}
